#ifndef XMLNODE_H
#define XMLNODE_H

#pragma once

#include "XML_global.h"

#include <vector>


using namespace std;
namespace xml{

    class TextNode;

    enum XMLSHARED_EXPORT NodeType
    {
        ELEMENT_NODE,
        TEXT_NODE
    };

    /*! ===================================================================
     *      @brief Classe de base uniquement utilisé pour le polymorphisme
     *  ===================================================================== */
    class XMLSHARED_EXPORT Node
    {
        /**********************************
         *          Public
         **********************************/
        public:

            /**********************************
             *          Constructors
             **********************************/

                Node();

            /**********************************
             *          Methods
             **********************************/

                void        AppendText(string str);
                Node &      AppendChild(Node & node);
                void        AppendChilds(vector<Node*> nodes);

                void        RemoveChild(int position);
                string      GetTabValue();


                /**********************************
                 *          Get
                 **********************************/

                    NodeType    Type();
                    Node *      FirstChild();
                    Node *      LastChild();
                    Node *      Child(int i);

                /**********************************
                 *          Set
                 **********************************/


                /**********************************
                 *          Virtual
                 **********************************/

                    virtual void        Print();
                    virtual void        Save(ofstream &f);
                    virtual string      Value();

            /**********************************
             *          Properties
             **********************************/

                // La variable de profondeur est utilisé lors de la sauvegarde pour déterminer
                // combien d'espace doivent être inséré pour faciliter la lisibilité
                int     Depth;

                vector<Node *>      Childs;


        /**********************************
         *          Protected
         **********************************/

            /**********************************
             *          Methods
             **********************************/

            /**********************************
             *          Properties
             **********************************/

                NodeType            m_Type;

        /**********************************
         *          Private
         **********************************/
        private :

            /**********************************
             *          Methods
             **********************************/

            /**********************************
             *          Properties
             **********************************/


                Node *  m_Parents;
    };
}
#endif // XMLNODE_H
